www.gusucode.com > 通过ODBC API实现对数据库的访问JavaScript源码程序 > 通过ODBC API实现对数据库的访问/ODBCApiDataManager/ODBCApiDataManager/DbOperator/DbOperator.cpp

    #include "StdAfx.h"
#include ".\dboperator.h"
CDbOperator::CDbOperator(void)
{
	m_strDSN = "DbMarket";
	m_strUSER = "hskj";
	m_strPWD = "newtech";

	henv = SQL_NULL_HANDLE;
	hdbc = SQL_NULL_HANDLE;

	m_bLink = FALSE;
	OpenDatabase();
}

CDbOperator::~CDbOperator(void)
{
	if(m_bLink)
	{
		SQLDisconnect(hdbc);
		SQLFreeHandle(SQL_HANDLE_DBC, hdbc); 
		SQLFreeHandle(SQL_HANDLE_ENV, henv);
		m_bLink = FALSE;
	}
}

CDbOperator::CDbOperator(CString strDSN, CString strUSER, CString strPWD)
{	
	henv = SQL_NULL_HANDLE;
	hdbc = SQL_NULL_HANDLE;

	m_strDSN = strDSN;
	m_strUSER = strUSER;
	m_strPWD = strPWD;

	m_bLink = FALSE;
	OpenDatabase();
}

BOOL CDbOperator::OpenDatabase()
{
	SQLINTEGER cbLenth = 0 ;	
	SQLRETURN retcode;

	retcode = SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,"SQL Server","DSN=DbMarket\0Description=odbctest\0Server=(local)\0Database=DbMarket\0\0");
	if(!retcode)
	{
		AfxMessageBox("系统数据源配置失败!");
		return FALSE;
	}

	retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv) ;
	if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
	{
		retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 
		if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
		{
			retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
			if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
			{
				retcode = SQLConnect(hdbc, (SQLCHAR*)(LPCTSTR)m_strDSN, SQL_NTS, (SQLCHAR*)(LPCTSTR)m_strUSER, SQL_NTS, 
					(SQLCHAR*)(LPCTSTR)m_strPWD, SQL_NTS);
				if (!(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO))
				{
					AfxMessageBox("数据库连接失败!") ;
					SQLFreeHandle(SQL_HANDLE_DBC, hdbc); 
					SQLFreeHandle(SQL_HANDLE_ENV, henv);
					return FALSE;
				}
			} 
			else
			{
				AfxMessageBox("连接句柄分配出错") ;
				SQLFreeHandle(SQL_HANDLE_DBC, hdbc); 
				SQLFreeHandle(SQL_HANDLE_ENV, henv);
				return FALSE;
			}
		}
		else
		{
			AfxMessageBox("属性设置出错!") ;
			SQLFreeHandle(SQL_HANDLE_ENV, henv);
			return FALSE;
		}
	}
	else
	{
		AfxMessageBox("环境变量分配出错!") ;
		SQLFreeHandle(SQL_HANDLE_ENV, henv);
		return FALSE;
	}
	m_bLink = TRUE;
	return TRUE;
}

BOOL CDbOperator::IsTableExisted(CString strTableName)
{
	SQLHSTMT hstmt ;
	SQLRETURN retcode;
	SQLINTEGER cbLenth = 0 ;

	CString strSQL;
	strSQL.Format("SELECT * FROM sysobjects WHERE name='%s'", strTableName);
	retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);	
	if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
	{	
		if (SQLExecDirect(hstmt, (SQLCHAR*)(LPCTSTR)strSQL, SQL_NTS) == SQL_ERROR)
		{
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
			return FALSE;
		}
		if((SQLFetch(hstmt) == SQL_SUCCESS) || (SQLFetch(hstmt) == SQL_SUCCESS_WITH_INFO))
		{		
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);	
			return  TRUE;
		}
		else
		{
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);	
			return FALSE;
		}			
	}
	else
	{	
		SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
		return FALSE;	
	}
}

BOOL CDbOperator::CreateTable(CString strSQL)
{
	SQLHSTMT hstmt ;
	SQLRETURN retcode;
	SQLINTEGER cbLenth = 0 ;

	retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);	
	if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
	{	
		if (SQLExecDirect(hstmt, (SQLCHAR*)(LPCTSTR)strSQL, SQL_NTS) != SQL_ERROR)
		{
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
			return TRUE;
		}
		else
		{
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);	
			return FALSE;
		}			
	}
	else
	{	
		SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
		return FALSE;	
	}	
}

BOOL CDbOperator::AlterTable(CString strSQL)
{
	SQLHSTMT hstmt ;
	SQLRETURN retcode;
	SQLINTEGER cbLenth = 0 ;

	retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);	
	if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
	{	
		if (SQLExecDirect(hstmt, (SQLCHAR*)(LPCTSTR)strSQL, SQL_NTS) != SQL_ERROR)
		{
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
			return TRUE;
		}
		else
		{
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);	
			return FALSE;
		}			
	}
	else
	{	
		SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
		return FALSE;	
	}
}

BOOL CDbOperator::DropTable(CString strSQL)
{
	SQLHSTMT hstmt ;
	SQLRETURN retcode;
	SQLINTEGER cbLenth = 0 ;

	retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);	
	if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
	{	
		if (SQLExecDirect(hstmt, (SQLCHAR*)(LPCTSTR)strSQL, SQL_NTS) != SQL_ERROR)
		{
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
			return TRUE;
		}
		else
		{
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);	
			return FALSE;
		}			
	}
	else
	{	
		SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
		return FALSE;	
	}
}

BOOL CDbOperator::InitAllTable()
{
	CStdioFile file;
	CFileException fileException;
	try
	{
		file.Open("Database.txt", CFile::modeRead | CFile::typeText, &fileException );
	}
	catch(CFileException* pEx)
	{
		char szError[1024];
		ZeroMemory(szError, 1024);
		pEx->GetErrorMessage(szError, 1024);
		AfxMessageBox(szError);
		return FALSE;
	}
	CString strSQL;
	CString strTableName;
	BOOL bIsTableExisted;
	BOOL bIsCreate;
	while(file.ReadString(strSQL))
	{
		if(GetTableNameFromSql(strSQL, strTableName))
		{
			bIsTableExisted = IsTableExisted(strTableName);
			if(!bIsTableExisted)
			{
				bIsCreate = CreateTable(strSQL);
				if(!bIsCreate)
				{
					AfxMessageBox("创建表失败!");
					return FALSE;
				}
			}
			else
			{
				//更新数据库,但暂不做更新
			}
		}
	}
	AfxMessageBox("创建表成功!");
	file.Close();
	//插入初始化表内容
	return TRUE;
}


BOOL CDbOperator::InsertContent(CString strSQL)
{
	SQLHSTMT hstmt ;
	SQLRETURN retcode;
	SQLINTEGER cbLenth = 0 ;

	retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);	
	if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
	{	
		if (SQLExecDirect(hstmt, (SQLCHAR*)(LPCTSTR)strSQL, SQL_NTS) != SQL_ERROR)
		{
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
			return TRUE;
		}
		else
		{
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);	
			return FALSE;
		}			
	}
	else
	{	
		SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
		return FALSE;	
	}
}
BOOL CDbOperator::InitTableContent()
{
	CStdioFile file;
	CFileException fileException;
	try
	{
		file.Open("TableContent.txt", CFile::modeRead | CFile::typeText, &fileException );
	}
	catch(CFileException* pEx)
	{
		char szError[1024];
		ZeroMemory(szError, 1024);
		pEx->GetErrorMessage(szError, 1024);
		AfxMessageBox(szError);
		return FALSE;
	}
	CString strSQL;
	while(file.ReadString(strSQL))
	{
		BOOL bIsInsert = InsertContent(strSQL);
		if(!bIsInsert)
		{
			AfxMessageBox("插入失败");
			return FALSE;
		}
		else
		{
			//更新数据库,但暂不做更新
		}
	}
	file.Close();
	return TRUE;
}

BOOL CDbOperator::GetTableNameFromSql(CString strSQL, CString& strTableName)
{
	//创建表的格式都是固定的模式:CREATE TABLE [TableName] ...
	int nTableBegin = strSQL.Find("[");
	if(nTableBegin == -1)
	{
		AfxMessageBox("没有找到相应的表头创建格式");
		return FALSE;
	}
	int nTableEnd = strSQL.Find(']');
	strTableName = strSQL.Mid(nTableBegin+1, nTableEnd-nTableBegin-1);
	return TRUE;
}

BOOL CDbOperator::GetUserIdFromObj_User(int arrUserId[], int& nUserCount)
{
	int nUserId = 0;
	nUserCount = 0;
	CString strSQL;

	SQLHSTMT hstmt ;
	SQLRETURN retcode;
	SQLINTEGER cbLenth = 0 ;
	strSQL = "SELECT User_Iden FROM Obj_User";
	retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);	
	if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
	{	
		SQLBindCol(hstmt, 1, SQL_C_ULONG, (SQLPOINTER)&nUserId, sizeof(nUserId), &cbLenth);	
		if (SQLExecDirect(hstmt, (SQLCHAR*)(LPCTSTR)strSQL, SQL_NTS) == SQL_ERROR)
		{
			AfxMessageBox("数据操作失败!") ;
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
			return FALSE;
		}
		while((SQLFetch(hstmt) == SQL_SUCCESS) || (SQLFetch(hstmt) == SQL_SUCCESS_WITH_INFO))
		{
			arrUserId[nUserCount] = nUserId;
			nUserCount++; 		
		}
		SQLFreeHandle(SQL_HANDLE_STMT, hstmt);	
		return  TRUE;		
	}
	else
	{	
		AfxMessageBox("数据操作失败!") ;
		SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
		return FALSE;	
	}
	return TRUE;
}

BOOL CDbOperator::GetNinaByUserId(int nUserId, CString& strNickname)
{
	SQLHSTMT hstmt ;
	SQLRETURN retcode;
	SQLINTEGER cbLenth = 0 ;
	char cNickname[100];
	ZeroMemory(cNickname, 100);

	CString strSQL;
	strSQL.Format("SELECT User_Nina FROM Obj_User WHERE User_Iden=%d", nUserId);
	retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);	
	if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
	{	
		SQLBindCol(hstmt, 1, SQL_C_CHAR, (SQLPOINTER)cNickname, 100, &cbLenth);	
		if (SQLExecDirect(hstmt, (SQLCHAR*)(LPCTSTR)strSQL, SQL_NTS) == SQL_ERROR)
		{
			AfxMessageBox("数据操作失败!") ;
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
			return FALSE;
		}
		if((SQLFetch(hstmt) == SQL_SUCCESS) || (SQLFetch(hstmt) == SQL_SUCCESS_WITH_INFO))
		{		
			strNickname = cNickname;
		}
		else
		{
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);	
			return FALSE;
		}
		SQLFreeHandle(SQL_HANDLE_STMT, hstmt);	
		return  TRUE;		
	}
	else
	{	
		AfxMessageBox("获取电业局数据操作失败!") ;
		SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
		return FALSE;	
	}
}

BOOL CDbOperator::GetUserpwdByUsernina(CString strUsernina, CString& strUserpwd)
{
	SQLHSTMT hstmt ;
	SQLRETURN retcode;
	SQLINTEGER cbLenth = 0 ;
	char cUserpwd[100];
	ZeroMemory(cUserpwd, 100);

	CString strSQL;
	strSQL.Format("SELECT User_Pawo FROM Obj_User WHERE User_Nina='%s'", strUsernina);
	retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);	
	if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
	{	
		SQLBindCol(hstmt, 1, SQL_C_CHAR, (SQLPOINTER)cUserpwd, 100, &cbLenth);	
		if (SQLExecDirect(hstmt, (SQLCHAR*)(LPCTSTR)strSQL, SQL_NTS) == SQL_ERROR)
		{
			AfxMessageBox("数据操作失败!") ;
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
			return FALSE;
		}
		if((SQLFetch(hstmt) == SQL_SUCCESS) || (SQLFetch(hstmt) == SQL_SUCCESS_WITH_INFO))
		{		
			strUserpwd = cUserpwd;
		}
		else
		{
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);	
			return FALSE;
		}
		SQLFreeHandle(SQL_HANDLE_STMT, hstmt);	
		return  TRUE;		
	}
	else
	{	
		AfxMessageBox("获取电业局数据操作失败!") ;
		SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
		return FALSE;	
	}
	return TRUE;
}

BOOL CDbOperator::GetAllUserTable(CString strTableName[], int& nTableCount)
{
	SQLHSTMT hstmt ;
	SQLRETURN retcode;
	SQLINTEGER cbLenth = 0 ;
	char cName[100];
	ZeroMemory(cName, 100);
	nTableCount = 0;

	CString strSQL;
	strSQL.Format("SELECT name FROM sysobjects WHERE xtype='%s'", "U");
	retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);	
	if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) 
	{	
		SQLBindCol(hstmt, 1, SQL_C_CHAR, (SQLPOINTER)cName, 100, &cbLenth);	
		if (SQLExecDirect(hstmt, (SQLCHAR*)(LPCTSTR)strSQL, SQL_NTS) == SQL_ERROR)
		{
			AfxMessageBox("数据操作失败!") ;
			SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
			return FALSE;
		}
		while((SQLFetch(hstmt) == SQL_SUCCESS) || (SQLFetch(hstmt) == SQL_SUCCESS_WITH_INFO))
		{		
			strTableName[nTableCount] = cName;
			nTableCount++;
		}
		SQLFreeHandle(SQL_HANDLE_STMT, hstmt);	
		return  TRUE;		
	}
	else
	{	
		AfxMessageBox("获取电业局数据操作失败!") ;
		SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
		return FALSE;	
	}
	return TRUE;
}